package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.log4j.Logger;
import org.primefaces.event.SelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;

import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.common.ISubject;
import pe.com.cotelasa.scp.controlador.backingBean.BKCompAddArticuloStock;
import pe.com.cotelasa.scp.controlador.backingBean.BKGuiaDeRemisionIN;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioArticuloSede;
import pe.com.cotelasa.scp.dominio.service.IServicioComposicionArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioDetalleOrdenCompraServicio;
import pe.com.cotelasa.scp.dominio.service.IServicioGuiaRemision;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenCompraServicio;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenPedido;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.ArticuloSede;
import pe.com.cotelasa.scp.entidad.ArticuloSedePK;
import pe.com.cotelasa.scp.entidad.ComposicionArticulo;
import pe.com.cotelasa.scp.entidad.DetalleGuiaRemision;
import pe.com.cotelasa.scp.entidad.DetalleOrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.DetallePedidoOp;
import pe.com.cotelasa.scp.entidad.GuiaRemision;
import pe.com.cotelasa.scp.entidad.MaterialConsumido;
import pe.com.cotelasa.scp.entidad.OrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.OrdenPedido;
import pe.com.cotelasa.scp.entidad.PartidaDespacho;
import pe.com.cotelasa.scp.entidad.Sede;
import pe.com.cotelasa.scp.entidad.TipoUnidadMinima;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@SuppressWarnings("serial")
@Named(value = "MBCompAddArticuloStock")
@Scope("request")
public class MBCompAddArticuloStock extends MBGenerico implements ISubject, Serializable {

    private static Logger logger = Logger.getLogger(MBCompAddArticuloStock.class);
    @Inject
    private IServicioArticuloSede servicioArticuloSede;
    @Inject
    private IServicioOrdenCompraServicio servicioOrdenCS;
    @Inject
    private IServicioOrdenPedido servicioOP;
    @Inject
    private BKCompAddArticuloStock bkCompAddArticuloStock;
    @Inject
    private BKGuiaDeRemisionIN bkGuiaRemision;
    @Inject
    private IServicioComposicionArticulo servicioComposicionArticulo;
    @Inject
    private IServicioArticulo servicioArticulo;
    @Inject
    private IServicioGuiaRemision servicioGuia;
    @Inject
    private IServicioDetalleOrdenCompraServicio servicioDetalleOCS;
    @Autowired
    BKSession session;

    public void cargarArticulosPorSede(ActionEvent actionEvent) {

        bkCompAddArticuloStock.setDetalleGuiaFormulario(new DetalleGuiaRemision());
        bkCompAddArticuloStock.getDetalleGuiaFormulario().setArticulo(new Articulo(0));
        bkCompAddArticuloStock.getDetalleGuiaFormulario().setTipoUnidadMinima(new TipoUnidadMinima());
        bkCompAddArticuloStock.getDetalleGuiaFormulario().setCantidad(BigDecimal.ONE);
        bkCompAddArticuloStock.addListaArticulosStock(new ArrayList<ArticuloSede>());
        bkCompAddArticuloStock.setListaPartida(new ArrayList<String>());
        bkCompAddArticuloStock.setNombreDialog((String) actionEvent.getComponent().getAttributes().get("dialogName"));
        bkCompAddArticuloStock.setUpdate((String) actionEvent.getComponent().getAttributes().get("update"));
        bkCompAddArticuloStock.setEstaProcesado(false);
        bkCompAddArticuloStock.setMensajeResultado("");
        bkCompAddArticuloStock.setSelectedArticulos(null);
        bkCompAddArticuloStock.setCantidadRecibido(null);
        bkCompAddArticuloStock.setCantidadPedido(null);
        bkCompAddArticuloStock.setArticuloSedeFormulario(new ArticuloSede());
        bkCompAddArticuloStock.setListaMaterialConsumido(new ArrayList<MaterialConsumido>());
        System.out.println("entro a detalle guia");
        bkCompAddArticuloStock.setGuiaFormulario((GuiaRemision) actionEvent.getComponent().getAttributes().get("guiaID"));
        if (bkCompAddArticuloStock.getGuiaFormulario().getParametroTipoGuia().getValCadena().equals(Constantes.TipoMovimiento.ENTRADA)) {
            bkCompAddArticuloStock.getDetalleGuiaFormulario().setPartidaLote("" + Integer.parseInt(bkCompAddArticuloStock.getGuiaFormulario().getNumeroGuia()));
            armarArticulosEntrada(bkCompAddArticuloStock.getGuiaFormulario());
        } else {
            System.out.println("es de salida");
            armarArticulosSalida(bkCompAddArticuloStock.getGuiaFormulario());
        }
    }

    public void armarArticulosEntrada(GuiaRemision guia) {
        Sede sede = guia.getSedePartida();


        if (guia.getIdOrdenCompraServicio().getId() == 0) {
            if (guia.getOrdenPedido().getId() != 0) {
                armarArticulosConOPSinOCS(guia.getOrdenPedido(), sede);
            }
        } else {
            if (guia.getIdOrdenCompraServicio().getTipo() == 'S'
                    && guia.getParametroMotivoGuia() != null && guia.getParametroMotivoGuia().getValCadena().equalsIgnoreCase("DEVOLUCION")) {
                armarArticulosDevolucion(guia);
            } else {

                try {
                    armarArticulosPorOCS(servicioDetalleOCS.listarDetallesPorOrden(guia.getIdOrdenCompraServicio()), guia);
                } catch (ServiceException e) {
                    logger.error(e.getMessage(), e);
                    mostrarError("Ocurrio un error al cargar la informacion.");
                }
            }
        }


    }

    public void armarArticulosDevolucion(GuiaRemision guia) {
        Sede sede = guia.getSedePartida();
        bkCompAddArticuloStock.getListaArticuloEncontrados().clear();

        Collection<DetalleGuiaRemision> listaDetalleGuia = new ArrayList<DetalleGuiaRemision>();
        bkCompAddArticuloStock.getListaArticulos().clear();

        try {

            if (sede.getId() != null) {
                for (GuiaRemision guiaR : //servicioOrdenCS.conseguirOrdenCompraServicioPorId(guia.getIdOrdenCompraServicio().getId())
                        guia.getIdOrdenCompraServicio()
                        .getGuiaRemisionCollection()) {
                    if (guiaR.getParametroTipoGuia().getValCadena().equals(Constantes.TipoMovimiento.SALIDA)
                            && guiaR.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())
                            && guiaR.getEstadoGuia().equals("" + GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor())) {
                        for (DetalleGuiaRemision detalleGuia : servicioGuia.conseguirGuiaDeRemisionPorId(guiaR.getId()).getDetalleGuiaRemisions()) {
                            if (detalleGuia.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())) {
                                listaDetalleGuia.add(detalleGuia);
                            }
                        }

                    }

                }

                ArticuloSede articuloSede = new ArticuloSede();
                articuloSede.setId(new ArticuloSedePK(session.getEmpresa().getId(), sede.getId(), 0, null));

                for (ArticuloSede artiSede : servicioArticuloSede.listaArticulosPorSedeConStock(articuloSede)) {
                    for (DetalleGuiaRemision detalle : listaDetalleGuia) {
                        if (artiSede.getArticulo() == detalle.getArticulo() && artiSede.getPartidaLote().equalsIgnoreCase(detalle.getPartidaLote())) {
                            bkCompAddArticuloStock.getListaArticuloEncontrados().add(artiSede);
                            boolean encontro = false;
                            for (Articulo art : bkCompAddArticuloStock.getListaArticulos()) {
                                if (artiSede.getArticulo() == art) {
                                    encontro = true;
                                    break;
                                }
                            }

                            if (!encontro) {
                                bkCompAddArticuloStock.getListaArticulos().add(artiSede.getArticulo());
                            }
                            break;
                        }
                    }
                }
            }

        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }

    }

    public void armarArticulosPorOCS(Collection<DetalleOrdenCompraServicio> listaDerOrdenCS, GuiaRemision guiaRemision) {
        bkCompAddArticuloStock.getListaArticulos().clear();
        for (DetalleOrdenCompraServicio item : listaDerOrdenCS) {
            if (item.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                System.out.println("articulo: " + item.getIdArticulo().getNombreComercial());
                bkCompAddArticuloStock.getListaArticulos().add(item.getIdArticulo());
            }
        }

    }

    public void elegirArticuloEntrada() {
        try {
            Articulo articulo = servicioArticulo.conseguirArticuloPorId(bkCompAddArticuloStock.getDetalleGuiaFormulario().getArticulo().getId());
            bkCompAddArticuloStock.setCantidadRecibido(BigDecimal.ZERO);
            for (DetalleOrdenCompraServicio detalleOrden : servicioDetalleOCS.listarDetallesPorOrden(bkCompAddArticuloStock.getGuiaFormulario().getIdOrdenCompraServicio())) {
                detalleOrden = servicioDetalleOCS.conseguirDetalleOrdenCompraServicioPorId(detalleOrden.getId());
                System.out.println("um = " + detalleOrden.getIdTipoUnidadMinima().getAbrev());

                if (detalleOrden.getIdArticulo().equals(articulo)) {
                    bkCompAddArticuloStock.setCantidadPedido(detalleOrden.getCantidad());
                    bkCompAddArticuloStock.getDetalleGuiaFormulario().setTipoUnidadMinima(detalleOrden.getIdTipoUnidadMinima());
                    bkCompAddArticuloStock.getDetalleGuiaFormulario().setDetalleOrdenCompraServicio(detalleOrden);
                    break;
                }
            }


            List<DetalleGuiaRemision> detallesGuia = buscarEntregado(
                    servicioOrdenCS.conseguirOrdenCompraServicioPorId(bkCompAddArticuloStock.getGuiaFormulario().getIdOrdenCompraServicio().getId()),
                    articulo);

            if (bkCompAddArticuloStock.getGuiaFormulario().getIdOrdenCompraServicio().getCrearPartidas() == 1) {
                cargarPartidasDespacho(detallesGuia, bkCompAddArticuloStock.getDetalleGuiaFormulario().getDetalleOrdenCompraServicio());
            }
            if (bkCompAddArticuloStock.getGuiaFormulario().getIdOrdenCompraServicio() != null && bkCompAddArticuloStock.getGuiaFormulario().getIdOrdenCompraServicio().getTipo() == 'S') {
                buscarMaterialesGuia(bkCompAddArticuloStock.getGuiaFormulario().getIdOrdenCompraServicio(), articulo, bkGuiaRemision.getListaMaterialEnServicio());
            }

        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }

    }

    public void cargarPartidasDespacho(List<DetalleGuiaRemision> detallesGuia, DetalleOrdenCompraServicio detalleOS) {

        detallesGuia.addAll(bkCompAddArticuloStock.getGuiaFormulario().getDetalleGuiaRemisions());
        bkCompAddArticuloStock.setListaPartida(new ArrayList<String>());



        for (PartidaDespacho partida : detalleOS.getPartidaDespachoCollection()) {
            if (partida.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                boolean econtrado = false;
                for (DetalleGuiaRemision detalle : detallesGuia) {
                    if (detalleOS.equals(detalle.getDetalleOrdenCompraServicio())
                            && detalle.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())) {
                        int idPartida = Integer.parseInt(detalle.getPartidaLote().split("-")[0]);
                        if (idPartida == partida.getNumeracion()) {
                            econtrado = true;
                            break;
                        }
                    }
                }
                if (!econtrado) {

                    String format = "%1$02d";
                    String palabra[] = partida.getDetalle().split(" ");
                    String partidaArmada = "";
                    if (palabra.length > 1) {
                        partidaArmada = String.format(format, partida.getNumeracion()) + "-"
                                + (palabra[0].length() > 3 ? palabra[0].substring(0, 3) : palabra[0])
                                + palabra[1].substring(0, 2)
                                + partida.getCantidad().intValue();
                    } else {
                        partidaArmada = String.format(format, partida.getNumeracion()) + "-"
                                + (palabra[0].length() > 3 ? palabra[0].substring(0, 3) : palabra[0]) + partida.getCantidad().intValue();
                    }
                    bkCompAddArticuloStock.getListaPartida().add(partidaArmada);

                }
            }
        }



    }

    public List<DetalleGuiaRemision> buscarEntregado(OrdenCompraServicio ordenCS, Articulo articulo) {

        BigDecimal recibido = BigDecimal.ZERO;
        List<DetalleGuiaRemision> detallesActivos = new ArrayList<DetalleGuiaRemision>();

        for (GuiaRemision guia : ordenCS.getGuiaRemisionCollection()) {
            if (guia.getParametroTipoGuia().getValCadena().equals(Constantes.TipoMovimiento.ENTRADA)
                    && guia.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())
                    && guia.getEstadoGuia().equals("" + GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor())) {
                try {
                    guia = servicioGuia.conseguirGuiaDeRemisionPorId(guia.getId());
                } catch (ServiceException e) {
                    logger.error(e.getMessage(), e);
                }

                for (DetalleGuiaRemision detalleGuia : guia.getDetalleGuiaRemisions()) {
                    if (articulo.equals(detalleGuia.getArticulo())
                            && detalleGuia.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())) {
                        detallesActivos.add(detalleGuia);
                        recibido = recibido.add(detalleGuia.getCantidad());
                    }
                }

            }

        }

        bkCompAddArticuloStock.setCantidadRecibido(recibido);

        return detallesActivos;
    }

    public void buscarMaterialesGuia(OrdenCompraServicio ordenCS, Articulo articulo, Collection<ArticuloSede> stockServicio) {

        bkCompAddArticuloStock.addListaArticulosStock(new ArrayList<ArticuloSede>());
        Collection<ArticuloSede> listaMaterialServicio = new ArrayList<ArticuloSede>();
        for (ArticuloSede art : stockServicio) {
            ArticuloSede art1 = new ArticuloSede();
            art1.setId(art.getId());
            art1.setArticulo(art.getArticulo());
            art1.setPartidaLote(art.getPartidaLote());
            art1.setCaStockDisponible(art.getCaStockDisponible());
            art1.setVaCosto(art.getVaCosto());
            listaMaterialServicio.add(art1);
        }


        //listaMaterialServicio.addAll(stockServicio);

        Collection<ArticuloSede> listaMaterial = new ArrayList<ArticuloSede>();
        Collection<MaterialConsumido> listaMaterialCons = new ArrayList<MaterialConsumido>();

        for (DetalleGuiaRemision detalle : bkCompAddArticuloStock.getGuiaFormulario().getDetalleGuiaRemisions()) {
            System.out.println("cantidad de materiales: " + detalle.getMaterialCunsumidoCollection());
            listaMaterialCons.addAll(detalle.getMaterialCunsumidoCollection());
        }

        for (ComposicionArticulo comp : articulo.getComposicionArticuloCollection()) {
            if (comp.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                for (ArticuloSede material : listaMaterialServicio) {
                    if (material.getArticulo().getId().equals(comp.getIdArticuloComp().getId())) {
                        BigDecimal cant = material.getCaStockDisponible();
                        System.out.println("material total del articulo " + material.getArticulo().getNombreComercial() + " = " + cant);
                        for (MaterialConsumido cons : listaMaterialCons) {
                            if (material.getArticulo().getId().equals(cons.getIdArticulo().getId())
                                    && material.getPartidaLote().equals(cons.getPartidaLote())
                                    && cons.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                                System.out.println("material consumido del articulo " + material.getArticulo().getNombreComercial() + " = " + cons.getCantidadConsumida());
                                cant = cant.subtract(cons.getCantidadConsumida());
                            }
                        }

                        if (cant.doubleValue() > 0) {
                            material.setCaStockDisponible(cant);
                            listaMaterial.add(material);
                        }

                    }
                }
            }
        }



        bkCompAddArticuloStock.addListaArticulosStock(listaMaterial);
        //bkCompAddArticuloStock.setCantidadRecibido(recibido);

    }

    public void procesarMaterial(ActionEvent event) {

        try {
            bkCompAddArticuloStock.setListaMaterialConsumido(new ArrayList<MaterialConsumido>());
            List<MaterialConsumido> listaMaterialConsumido = new ArrayList<MaterialConsumido>();
            bkCompAddArticuloStock.setMensajeNota("");
            if (bkCompAddArticuloStock.getSelectedArticulos().length > 0) {//Comprobar si se eligieron los materiales a procesar

                boolean esCorrecto = true;
                BigDecimal merma = bkCompAddArticuloStock.getGuiaFormulario().getIdOrdenCompraServicio().getPorcentajeMerma().divide(new BigDecimal(100));

                if (bkCompAddArticuloStock.getDetalleGuiaFormulario().getCantidad() == null) {//Comprobar que se ingreso la cantidad a procesar
                    bkCompAddArticuloStock.setMensajeResultado("Ingrese la cantidad a procesar.");
                    esCorrecto = false;
                } else {
                    System.out.println("cantidad que se procesa " + bkCompAddArticuloStock.getDetalleGuiaFormulario().getCantidad());
                    BigDecimal cantiConMerma = bkCompAddArticuloStock.getDetalleGuiaFormulario().getCantidad().multiply(merma.add(BigDecimal.ONE));
                    //Buscar la cantidad con merma del Articulo Elegido
                    System.out.println("cantidad que se procesa con merma " + cantiConMerma);

                    for (ComposicionArticulo comp : servicioArticulo.conseguirArticuloPorId(
                            bkCompAddArticuloStock.getDetalleGuiaFormulario().getArticulo().getId()).getComposicionArticuloCollection()) {
                        //Buscar los masteriales que componen el Articulo Elegido
                        if (comp.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                            BigDecimal compCant = comp.getCantidad();
                            if (comp.getTipo().equals("%")) {
                                compCant = compCant.divide(new BigDecimal(100));
                            }
                            BigDecimal sobrante = BigDecimal.ZERO;
                            BigDecimal cantidadComp = cantiConMerma.multiply(compCant);//Cuanta cantidad se necesita de este material para cubrir el Articulo Elegido
                            boolean entro = false;
                            for (ArticuloSede articuloSede : bkCompAddArticuloStock.getSelectedArticulos()) {
                                MaterialConsumido material = new MaterialConsumido();
                                BigDecimal cantidad = BigDecimal.ZERO;
                                if (comp.getIdArticuloComp().getId().equals(articuloSede.getArticulo().getId())) {//Comprobar si este material ha sido seleccionado

                                    entro = true;
                                    System.out.println("porcentaje de merma de " + articuloSede.getArticulo().getNombreComercial() + " es: " + compCant);
                                    System.out.println("cantidad de material " + articuloSede.getCaStockDisponible());

                                    cantidad = articuloSede.getCaStockDisponible().subtract(cantidadComp);//Se resta la cantidad de material necesario a lo que hay.
                                    System.out.println("se resta " + cantidad);

                                    material.setValorCosto(articuloSede.getVaCosto());
                                    material.setIdArticulo(articuloSede.getArticulo());
                                    material.setPartidaLote(articuloSede.getPartidaLote());
                                    if (cantidad.doubleValue() > 0) {//Si hay mas material de lo que se necesita

                                        material.setCantidadConsumida(cantidadComp);
                                        material.setValorTotal(articuloSede.getVaCosto().multiply(material.getCantidadConsumida()));
                                        listaMaterialConsumido.add(material);
                                        cantidadComp = BigDecimal.ZERO;
                                        System.out.println("queda por procesar 1 " + cantidadComp);
                                        break;
                                    } else {//Si no alcanza con este material
                                        cantidadComp = cantidadComp.subtract(articuloSede.getCaStockDisponible());
                                        material.setCantidadConsumida(articuloSede.getCaStockDisponible());
                                        material.setValorTotal(articuloSede.getVaCosto().multiply(material.getCantidadConsumida()));
                                        listaMaterialConsumido.add(material);
                                        System.out.println("queda por procesar 2 " + cantidadComp);
                                        /*listaMaterialConsumido.clear();
                                         bkCompAddArticuloStock.setMensajeResultado("El articulo: " + articuloSede.getArticulo().getNombreComercial() + " no cumple con la cantidad.");
                                         esCorrecto = false;*/
                                    }
                                }
                            }

                            if (cantidadComp.doubleValue() > 0 && entro) {
                                bkCompAddArticuloStock.setMensajeNota(bkCompAddArticuloStock.getMensajeNota() + "El articulo " + comp.getIdArticuloComp().getNombreComercial() + " terminará con cantidad -" + cantidadComp + "<br />");
                                //esCorrecto = false;
                                System.out.println("nota: " + bkCompAddArticuloStock.getMensajeNota());
                                listaMaterialConsumido.get(listaMaterialConsumido.size() - 1).setCantidadConsumida(
                                        listaMaterialConsumido.get(listaMaterialConsumido.size() - 1).getCantidadConsumida().add(cantidadComp));
                                System.out.println("material consumido: "+listaMaterialConsumido.get(listaMaterialConsumido.size() - 1).getCantidadConsumida());
                                //listaMaterialConsumido.clear();
                                //break;
                            }


                        }
                    }

                    if (esCorrecto) {
                        System.out.println("lista de materiales 1: " + listaMaterialConsumido);
                        System.out.println("lista de materiales 2: " + bkCompAddArticuloStock.getListaMaterialConsumido());
                        String observacion = "";
                        for (MaterialConsumido mat : listaMaterialConsumido) {
                            bkCompAddArticuloStock.setMensajeResultado("Los materiales cumplen con las cantidades.");
                            System.out.println("cantidad consumida de: " + mat.getPartidaLote() + " = " + mat.getCantidadConsumida());
                            mat.setIdSede(bkCompAddArticuloStock.getGuiaFormulario().getSedePartida());
                            mat.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
                            mat.setUsrCreacion(session.getUsuario().getUsuario());
                            mat.setFecCreacion(new Date());
                            mat.setIdDetalleGuia(bkCompAddArticuloStock.getDetalleGuiaFormulario());
                            observacion += mat.getPartidaLote() + " = " + mat.getCantidadConsumida().setScale(2, RoundingMode.DOWN) + " ; ";
                            bkCompAddArticuloStock.getListaMaterialConsumido().add(mat);
                        }
                        bkCompAddArticuloStock.getDetalleGuiaFormulario().setObservacion(observacion);
                        System.out.println("lista de materiales : " + bkCompAddArticuloStock.getListaMaterialConsumido());
                        System.out.println("cantidad de materiales : " + bkCompAddArticuloStock.getListaMaterialConsumido().size());
                    }
                }


                bkCompAddArticuloStock.setEstaProcesado(esCorrecto);

            } else {
                bkCompAddArticuloStock.setEstaProcesado(false);
                bkCompAddArticuloStock.setMensajeResultado("Debe elegir los materiales.");
            }
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }

    }

    public void armarArticulosConOPSinOCS(OrdenPedido ordenP, Sede sede) {
        try {
            OrdenPedido orden = servicioOP.conseguirOrdenPedidoPorId(ordenP.getId());
            List<Articulo> listaArticulo = null;
            if (orden.getTipoOp() == 'T') {
                listaArticulo = buscarArticulosCompPorPedidoTela(orden);
            } else {
                listaArticulo = buscarArticulosCompPorPedidoPrenda(orden);
            }
            ArticuloSede articuloSede = new ArticuloSede();
            articuloSede.setId(new ArticuloSedePK(session.getEmpresa().getId(), sede.getId(), 0, null));
            for (ArticuloSede artiSede : servicioArticuloSede.listaArticulosPorSedeConStock(articuloSede)) {
                for (Articulo art : listaArticulo) {

                    if (artiSede.getArticulo().getId().equals(art.getId())) {
                        bkCompAddArticuloStock.getListaArticuloEncontrados().add(artiSede);
                        //bkCompAddArticuloStock.getListaArticulos().add(art);

                        boolean encontro = false;
                        //bkCompAddArticuloStock.getListaArticuloEncontrados().add(artiSede);
                        for (Articulo art1 : bkCompAddArticuloStock.getListaArticulos()) {
                            if (artiSede.getArticulo().getId().equals(art1.getId())) {
                                encontro = true;
                                break;
                            }
                        }

                        if (!encontro) {
                            bkCompAddArticuloStock.getListaArticulos().add(artiSede.getArticulo());
                        }


                    }
                }
            }
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }

    }

    public void armarArticulosSalida(GuiaRemision guia) {

        Sede sede = guia.getSedePartida();
        bkCompAddArticuloStock.getListaArticuloEncontrados().clear();

        Collection<ComposicionArticulo> listaArticulosComp = new ArrayList<ComposicionArticulo>();
        bkCompAddArticuloStock.setListaArticulos(new ArrayList<Articulo>());


        try {

            if (sede.getId() != null) {
                if (guia.getIdOrdenCompraServicio().getId() == 0) {
                    if (guia.getOrdenPedido().getId() != 0) {
                        armarArticulosConOPSinOCS(guia.getOrdenPedido(), sede);
                    } else {
                        ArticuloSede articuloSede = new ArticuloSede();
                        articuloSede.setId(new ArticuloSedePK(session.getEmpresa().getId(), sede.getId(), 0, null));
                        for (ArticuloSede artiSede : servicioArticuloSede.listaArticulosPorSedeConStock(articuloSede)) {
                            boolean encontro = false;
                            bkCompAddArticuloStock.getListaArticuloEncontrados().add(artiSede);
                            for (Articulo art : bkCompAddArticuloStock.getListaArticulos()) {
                                if (artiSede.getArticulo() == art) {
                                    encontro = true;
                                    break;
                                }
                            }

                            if (!encontro) {
                                bkCompAddArticuloStock.getListaArticulos().add(artiSede.getArticulo());
                            }
                        }
                    }
                } else {
                    if (guia.getParametroMotivoGuia().getValCadena().contains("TRANSFORMACION")) {
                        for (DetalleOrdenCompraServicio detalle : servicioDetalleOCS.listarDetallesPorOrden(guia.getIdOrdenCompraServicio())) {

                            for (ComposicionArticulo comp : detalle.getIdArticulo().getComposicionArticuloCollection()) {
                                if (comp.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                                    boolean encontro = false;
                                    for (ComposicionArticulo compArt : listaArticulosComp) {

                                        if (compArt.getIdArticuloComp().getId().equals(comp.getIdArticuloComp().getId())) {
                                            encontro = true;
                                            break;
                                        }

                                    }

                                    if (!encontro) {
                                        listaArticulosComp.add(comp);
                                    }

                                }
                            }
                        }
                    }

                    ArticuloSede articuloSede = new ArticuloSede();
                    articuloSede.setId(new ArticuloSedePK(session.getEmpresa().getId(), sede.getId(), 0, null));
                    System.out.println("articulos con stock: " + servicioArticuloSede.listaArticulosPorSedeConStock(articuloSede));
                    for (ArticuloSede artiSede : servicioArticuloSede.listaArticulosPorSedeConStock(articuloSede)) {
                        if (guia.getParametroMotivoGuia().getValCadena().contains("TRANSFORMACION")) {
                            for (ComposicionArticulo compBuscar : listaArticulosComp) {
                                if (artiSede.getArticulo() == compBuscar.getIdArticuloComp()) {
                                    boolean encontro = false;
                                    bkCompAddArticuloStock.getListaArticuloEncontrados().add(artiSede);
                                    for (Articulo art : bkCompAddArticuloStock.getListaArticulos()) {
                                        if (artiSede.getArticulo() == art) {
                                            encontro = true;
                                            break;
                                        }
                                    }

                                    if (!encontro) {
                                        bkCompAddArticuloStock.getListaArticulos().add(artiSede.getArticulo());
                                    }

                                }
                            }
                        } else {

                            for (DetalleOrdenCompraServicio detalle : servicioDetalleOCS.listarDetallesPorOrden(guia.getIdOrdenCompraServicio())) {
                                if (detalle.getIdArticulo().getId().equals(artiSede.getArticulo().getId())) {
                                    boolean encontro = false;
                                    bkCompAddArticuloStock.getListaArticuloEncontrados().add(artiSede);
                                    for (Articulo art : bkCompAddArticuloStock.getListaArticulos()) {
                                        if (artiSede.getArticulo() == art) {
                                            encontro = true;
                                            break;
                                        }
                                    }

                                    if (!encontro) {
                                        bkCompAddArticuloStock.getListaArticulos().add(artiSede.getArticulo());
                                    }
                                }
                            }


                        }
                    }


                }

            }

        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public void armarArticulosOtrasSalida(Sede sede) {
        try {
            ArticuloSede articuloSede = new ArticuloSede();
            articuloSede.setId(new ArticuloSedePK(session.getEmpresa().getId(), sede.getId(), 0, null));
            System.out.println("articulos con stock: " + servicioArticuloSede.listaArticulosPorSedeConStock(articuloSede));
            for (ArticuloSede artiSede : servicioArticuloSede.listaArticulosPorSedeConStock(articuloSede)) {

                boolean encontro = false;
                bkCompAddArticuloStock.getListaArticuloEncontrados().add(artiSede);
                for (Articulo art : bkCompAddArticuloStock.getListaArticulos()) {
                    if (artiSede.getArticulo() == art) {
                        encontro = true;
                        break;
                    }
                }

                if (!encontro) {
                    bkCompAddArticuloStock.getListaArticulos().add(artiSede.getArticulo());
                }

            }
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public void elegirArticuloSalida() {
        bkCompAddArticuloStock.getListaPartida().clear();
        bkCompAddArticuloStock.getDetalleGuiaFormulario().setPartidaLote("");
        for (ArticuloSede articuloS : bkCompAddArticuloStock.getListaArticuloEncontrados()) {
            System.out.println("lista de articulos en sede " + bkCompAddArticuloStock.getListaArticuloEncontrados());
            if (articuloS.getId().getIdArticulo().equals(bkCompAddArticuloStock.getDetalleGuiaFormulario().getArticulo().getId())) {
                BigDecimal cant = articuloS.getCaStockDisponible();
                for (DetalleGuiaRemision detalle : bkCompAddArticuloStock.getGuiaFormulario().getDetalleGuiaRemisions()) {
                    if (articuloS.getId().getIdArticulo().equals(detalle.getArticulo().getId())
                            && articuloS.getId().getPartidaLote().equals(detalle.getPartidaLote())
                            && detalle.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())) {
                        cant = cant.subtract(detalle.getCantidad());

                    }

                }
                if (cant.doubleValue() > 0) {
                    if (articuloS.getPartidaLote().equalsIgnoreCase("")) {
                        bkCompAddArticuloStock.getListaPartida().add("SIN PARTIDA");
                    } else {
                        bkCompAddArticuloStock.getListaPartida().add(articuloS.getPartidaLote());
                    }

                }

            }

        }

        //bkCompAddArticuloStock.getArticuloSedeFormulario().setCaStockDisponible(BigDecimal.ZERO);


    }

    public void elegirPartidaSalida() {
        //bkCompAddArticuloStock.getDetalleGuiaFormulario().setCantidad(new BigDecimal(0.1));
        ArticuloSede articulo = new ArticuloSede();
        if (bkCompAddArticuloStock.getDetalleGuiaFormulario().getPartidaLote().equalsIgnoreCase("SIN PARTIDA")) {
            bkCompAddArticuloStock.getDetalleGuiaFormulario().setPartidaLote("");
        }
        for (ArticuloSede articuloS : bkCompAddArticuloStock.getListaArticuloEncontrados()) {
            if (articuloS.getId().getIdArticulo().equals(bkCompAddArticuloStock.getDetalleGuiaFormulario().getArticulo().getId())
                    && articuloS.getId().getPartidaLote().equals(bkCompAddArticuloStock.getDetalleGuiaFormulario().getPartidaLote())) {

                try {
                    articuloS = servicioArticuloSede.buscarArticuloSede(articuloS);
                } catch (ServiceException e) {
                    logger.error(e.getMessage(), e);
                    mostrarError("Ocurrio un error al cargar la informacion.");
                }
                articulo = articuloS;
                bkCompAddArticuloStock.getDetalleGuiaFormulario().setTipoUnidadMinima(articuloS.getUnidadMedida());

            }
        }

        for (DetalleGuiaRemision detalle : bkCompAddArticuloStock.getGuiaFormulario().getDetalleGuiaRemisions()) {
            if (articulo.getId().getIdArticulo().equals(detalle.getArticulo().getId())
                    && articulo.getId().getPartidaLote().equals(detalle.getPartidaLote())
                    && detalle.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())) {
                articulo.setCaStockDisponible(articulo.getCaStockDisponible().subtract(detalle.getCantidad()));
            }
        }
        bkCompAddArticuloStock.getDetalleGuiaFormulario().setCantidad(articulo.getCaStockDisponible());
        bkCompAddArticuloStock.setArticuloSedeFormulario(articulo);

    }

    public void agregarDetalle() {
        try {
            if (bkCompAddArticuloStock.getDetalleGuiaFormulario().getPartidaLote().equalsIgnoreCase("SIN PARTIDA")) {
                bkCompAddArticuloStock.getDetalleGuiaFormulario().setPartidaLote("");
            }
            bkCompAddArticuloStock.getDetalleGuiaFormulario().setArticulo(servicioArticulo.conseguirArticuloPorId(
                    bkCompAddArticuloStock.getDetalleGuiaFormulario().getArticulo().getId()));

            bkCompAddArticuloStock.getDetalleGuiaFormulario().setEstadoRegistro("" + ESTADO_REGISTRO.ACTIVO.getValor());
            bkCompAddArticuloStock.getDetalleGuiaFormulario().setUsrCreacion(session.getUsuario().getUsuario());
            bkCompAddArticuloStock.getDetalleGuiaFormulario().setFecCreacion(new Date());
            if (bkCompAddArticuloStock.getListaMaterialConsumido().size() > 0) {
                bkCompAddArticuloStock.getDetalleGuiaFormulario().setMaterialCunsumidoCollection(bkCompAddArticuloStock.getListaMaterialConsumido());
            }
            notificarObservadores();

        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    @Override
    public void addObserver(IObserver observador) {
        bkCompAddArticuloStock.addObservers(observador);
    }

    @Override
    public void notificarObservadores() {
        try {
            bkCompAddArticuloStock.getObservers().get(bkCompAddArticuloStock.getObservers().size() - 1).actualizarObservador(bkCompAddArticuloStock.getDetalleGuiaFormulario());
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }

    }

    public List<Articulo> buscarArticulosCompPorPedidoTela(OrdenPedido ordenPedido) {
        List<Articulo> listaArticulo = new ArrayList<Articulo>();
        try {

            String modelo = "";
            for (DetallePedidoOp detalleOP : ordenPedido.getDetallePedidoOpCollection()) {
                if (detalleOP.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                    ComposicionArticulo composicion = new ComposicionArticulo();
                    composicion.setIdArticulo(detalleOP.getIdArticulo());
                    listaArticulo.add(detalleOP.getIdArticulo());
                    Collection<ComposicionArticulo> listaComposicion = servicioComposicionArticulo.buscarComposicionPorArticulo(composicion);

                    Iterator itr = listaComposicion.iterator();
                    //if (!modelo.equalsIgnoreCase(detalleOP.getIdArticulo().getModelo())) {

                    while (itr.hasNext()) {
                        ComposicionArticulo comp = (ComposicionArticulo) itr.next();

                        if (listaArticulo.contains(comp.getIdArticuloComp())) {
                        } else {
                            listaArticulo.add(comp.getIdArticuloComp());
                            ComposicionArticulo composicion1 = new ComposicionArticulo();
                            composicion1.setIdArticulo(comp.getIdArticuloComp());
                            Collection<ComposicionArticulo> listaComposicionAdd = servicioComposicionArticulo.buscarComposicionPorArticulo(composicion1);
                            itr.remove();
                            if (listaComposicionAdd.size() > 0) {
                                listaComposicion.addAll(listaComposicionAdd);
                            }
                            itr = listaComposicion.iterator();

                        }
                    }
                    modelo = detalleOP.getIdArticulo().getModelo();
                }
                //}
            }

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return listaArticulo;
    }

    public List<Articulo> buscarArticulosCompPorPedidoPrenda(OrdenPedido ordenPedido) {

        try {
            List<Articulo> listaArticulo = new ArrayList<Articulo>();
            String modelo = "";
            for (DetallePedidoOp detalleOP : ordenPedido.getDetallePedidoOpCollection()) {

                ComposicionArticulo composicion = new ComposicionArticulo();
                composicion.setIdArticulo(detalleOP.getIdArticulo());
                listaArticulo.add(detalleOP.getIdArticulo());
                Collection<ComposicionArticulo> listaComposicion = servicioComposicionArticulo.buscarComposicionPorArticulo(composicion);

                Iterator itr = listaComposicion.iterator();
                if (!modelo.equalsIgnoreCase(detalleOP.getIdArticulo().getModelo())) {
                    while (itr.hasNext()) {
                        ComposicionArticulo comp = (ComposicionArticulo) itr.next();

                        if (listaArticulo.contains(comp.getIdArticuloComp())) {
                        } else {
                            listaArticulo.add(comp.getIdArticuloComp());

                        }
                        if (!comp.getIdArticuloComp().getIdCategoriaArticulo().getNombre().contains("TELA")) {
                            ComposicionArticulo composicion1 = new ComposicionArticulo();
                            composicion1.setIdArticulo(comp.getIdArticuloComp());
                            Collection<ComposicionArticulo> listaComposicionAdd = servicioComposicionArticulo.buscarComposicionPorArticulo(composicion1);
                            itr.remove();
                            if (listaComposicionAdd.size() > 0) {
                                listaComposicion.addAll(listaComposicionAdd);
                            }
                            itr = listaComposicion.iterator();
                        }
                    }
                    modelo = detalleOP.getIdArticulo().getModelo();
                }
            }
            return listaArticulo;

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return null;
    }

    public String buscarDireccion(GuiaRemision guia) {

        String URL = "";

        if (guia.getParametroTipoGuia().getValCadena().equals(Constantes.TipoMovimiento.SALIDA)) {
            URL = "../../paginas/inventario/guiaDeRemision/salida/detalleGuia.xhtml";
        } else {
            URL = "../../paginas/inventario/guiaDeRemision/entrada/detalleGuia.xhtml";
            if (guia.getIdOrdenCompraServicio().getId() != 0) {
                if (guia.getIdOrdenCompraServicio().getTipo() == 'S') {
                    URL = "../../paginas/inventario/guiaDeRemision/entrada/detalleGuiaServicio.xhtml";
                    if (guia.getParametroMotivoGuia() != null && guia.getParametroMotivoGuia().getValCadena().equalsIgnoreCase("DEVOLUCION")) {
                        URL = "../../paginas/inventario/guiaDeRemision/entrada/detalleGuiaDevolucion.xhtml";
                    }
                } else {
                    URL = "../../paginas/inventario/guiaDeRemision/entrada/detalleGuia.xhtml";
                }


            }

        }
        //System.out.println(""+URL);
        return URL;
    }

    public void elegirParametro(SelectEvent event) {
        bkCompAddArticuloStock.setActivarAgregar(false);
        bkGuiaRemision.getGuiaFormulario().setDetalleGuiaRemisions(new ArrayList<DetalleGuiaRemision>());
    }
}
